<html>
<head><meta charset="utf-8"><title>New name resolution · t-compiler/rust-analyzer · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/index.html">t-compiler/rust-analyzer</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html">New name resolution</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="159814557"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/159814557" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#159814557">(Mar 02 2019 at 21:00)</a>:</h4>
<p>I am starting on integrated name-resoltion/macro-expansion in this branch: <a href="https://github.com/rust-analyzer/rust-analyzer/tree/name-resolution-2" target="_blank" title="https://github.com/rust-analyzer/rust-analyzer/tree/name-resolution-2">https://github.com/rust-analyzer/rust-analyzer/tree/name-resolution-2</a></p>
<p>I still don't have a clear picture in my head about how this all should work together, hopefully writing some code should make this clearer.</p>



<a name="159814631"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/159814631" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#159814631">(Mar 02 2019 at 21:02)</a>:</h4>
<p>The current plan is to center nameres around <code>CrateDefMap</code> datastructure. </p>
<p>In theory, <code>CrateDefMap</code> should contain information about all top-level declarations inside the macro-expanded crate. It should also be a home for the tree of modules. We will populate <code>CrateDefMap</code> in one go, but we should't recalculate it unless the user types something on the module top-level.</p>



<a name="160024016"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024016" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024016">(Mar 05 2019 at 17:52)</a>:</h4>
<p>So, I must confess I am feeling a little bit like "name resolution is stuck" error :D</p>



<a name="160024055"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024055" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024055">(Mar 05 2019 at 17:53)</a>:</h4>
<p>I haven't written any working code, but made this comment explaining the proposed algorithm and imitations I am running into: <a href="https://github.com/rust-analyzer/rust-analyzer/blob/a5aa2fe7bb25fa0cb3a4f8c67d21121eb0fbb73d/crates/ra_hir/src/nameres/crate_def_map.rs#L1" target="_blank" title="https://github.com/rust-analyzer/rust-analyzer/blob/a5aa2fe7bb25fa0cb3a4f8c67d21121eb0fbb73d/crates/ra_hir/src/nameres/crate_def_map.rs#L1">https://github.com/rust-analyzer/rust-analyzer/blob/a5aa2fe7bb25fa0cb3a4f8c67d21121eb0fbb73d/crates/ra_hir/src/nameres/crate_def_map.rs#L1</a></p>



<a name="160024091"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024091" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024091">(Mar 05 2019 at 17:53)</a>:</h4>
<p>The problem I am trying to solve is that I want to <em>not</em> rerun global name resolution after a change inside item body.</p>



<a name="160024159"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024159" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024159">(Mar 05 2019 at 17:54)</a>:</h4>
<p>Without macros, this works by placing an intermediate query between parsing and name res, which returns a set of top-level items.</p>



<a name="160024189"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024189" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024189">(Mar 05 2019 at 17:54)</a>:</h4>
<p>With macros, things get interesting. Consider this code:</p>
<div class="codehilite"><pre><span></span>lazy_static! {
    static ref HASHMAP: HashMap&lt;u32, &amp;&#39;static str&gt; = {
        let mut m = HashMap::new();
        m.insert(0, &quot;foo&quot;);
        m.insert(1, &quot;bar&quot;);
        m.insert(2, &quot;baz&quot;);
        m
    };
}
</pre></div>



<a name="160024264"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024264" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024264">(Mar 05 2019 at 17:56)</a>:</h4>
<p>Ideally, we should not re-run name resolution if we remove <code>m.insert(1, "bar");</code> line: we should re-run only the lazy_static macro itself, check that it produced the same items as the last time, and be done with it.</p>



<a name="160024349"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024349" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024349">(Mar 05 2019 at 17:56)</a>:</h4>
<p>This wont work for naive intermediate query, which stores input token trees for macro calls.</p>



<a name="160024468"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024468" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024468">(Mar 05 2019 at 17:58)</a>:</h4>
<p>The fix would be to apply intermediate query recursively: instead of storing token tree itself in the result, store only some macro ID, and than have an <code>expand macro id to top-level items query</code>.</p>



<a name="160024527"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024527" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024527">(Mar 05 2019 at 17:59)</a>:</h4>
<p>However, I don't think I can assign an id to the macro invocation: assigning Ids needs results of name resolution, and we are running name resolution right now! That is, the <code>HirFileId</code> trick we use today in ra to identify macros works only because macros are not really a part of name resolution</p>



<a name="160024633"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024633" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024633">(Mar 05 2019 at 18:00)</a>:</h4>
<p>cc <span class="user-group-mention" data-user-group-id="1060">@WG-rls2.0</span> this is an interesting question :) Does anybody understands the problem I am trying to solve? Do we have any suggestions? :)</p>



<a name="160024699"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024699" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024699">(Mar 05 2019 at 18:01)</a>:</h4>
<p>Why does assigning IDs require the results of name resolution? can't you do an 'nth macro in file x' type of ID?</p>



<a name="160024783"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024783" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024783">(Mar 05 2019 at 18:02)</a>:</h4>
<p>I can do that if <code>x</code> is a <code>FileId</code>. If <code>x</code> is a file produced by a macro, I am unsure how to do that</p>



<a name="160024794"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024794" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024794">(Mar 05 2019 at 18:02)</a>:</h4>
<p>though the query expanding that would depend on name resolution then, wouldn't it... <span aria-label="thinking" class="emoji emoji-1f914" role="img" title="thinking">:thinking:</span></p>



<a name="160024813"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160024813" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160024813">(Mar 05 2019 at 18:02)</a>:</h4>
<p>yeah, precisely</p>



<a name="160025019"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160025019" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160025019">(Mar 05 2019 at 18:05)</a>:</h4>
<p>I see two possible "solutions" here:</p>
<ul>
<li>concede that deleting <code>m.insert(1, "bar");</code> line invalidates name resolution</li>
<li>(not sure if this even is possible) add an explicit fixed-point "round" to the query parameter. That way, we can refer, via queries to macros from current-round - 1.</li>
</ul>



<a name="160025824"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160025824" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jeremy Kolb <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160025824">(Mar 05 2019 at 18:16)</a>:</h4>
<blockquote>
<ul>
<li>concede that deleting <code>m.insert(1, "bar");</code> line invalidates name resolution</li>
</ul>
</blockquote>
<p>How bad would this be in practice?</p>



<a name="160025923"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160025923" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160025923">(Mar 05 2019 at 18:17)</a>:</h4>
<p>worst case pretty horrible</p>
<div class="codehilite"><pre><span></span>#[cfg(test)]
mod tests {
    loooots of code
}
</pre></div>



<a name="160025949"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160025949" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160025949">(Mar 05 2019 at 18:17)</a>:</h4>
<p><code>cfg(test)</code> here is more or less a macro that applies to the following item</p>



<a name="160025953"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160025953" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160025953">(Mar 05 2019 at 18:17)</a>:</h4>
<p>similarly, derives are macros</p>



<a name="160026534"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160026534" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jeremy Kolb <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160026534">(Mar 05 2019 at 18:24)</a>:</h4>
<p>so I don't know if this would work but could you assign ids based on something besides name res? like... a weird hash of all potential names?</p>



<a name="160026551"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160026551" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jeremy Kolb <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160026551">(Mar 05 2019 at 18:24)</a>:</h4>
<p>make it a bit fuzzy, sort of a best guess</p>



<a name="160026779"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160026779" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160026779">(Mar 05 2019 at 18:27)</a>:</h4>
<p>we don't assign ids based on name refs. An ID is an interned location, where location is something like "the nth macro in the foo file"</p>



<a name="160026900"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160026900" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160026900">(Mar 05 2019 at 18:28)</a>:</h4>
<p>for macro expansion, locations should contain a macro expansion backtrace "to find this thing, go to the nth macro in file foo, than to kth macro inside that macro's expansion, then to the mth item in the second expansion".</p>



<a name="160027000"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027000" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027000">(Mar 05 2019 at 18:29)</a>:</h4>
<p>And we can't <em>use</em> such ids until macro expansion is fully complete, if we do macro exapnsion in a single query. If we do macro expansion as fine-grained queries this works, but fine-grained queries don't work with fixed-point iteration nature of macro expansion</p>



<a name="160027227"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027227" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027227">(Mar 05 2019 at 18:31)</a>:</h4>
<p>So, the bad intrraction here is that we want "expand single macro" to be a query, such that we can project items out of the full syntax trees and ignore local modifications. At the same time, we have to use "expand all the macros" mega query to avoid cyclic queries.</p>



<a name="160027376"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027376" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> detrumi <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027376">(Mar 05 2019 at 18:33)</a>:</h4>
<p>Why do you get cyclic queries then? Because macros can bring names into scope that change behavior?</p>



<a name="160027549"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027549" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027549">(Mar 05 2019 at 18:34)</a>:</h4>
<p>More or less: at it's heart, nameresoluton and macro-expansion is a fixed point iteration style algorithm. If you implement this algorithm using a naive recursion, you can get an infinite loop</p>



<a name="160027562"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027562" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027562">(Mar 05 2019 at 18:35)</a>:</h4>
<p>I wonder if Salsa could add special support for 'fixpoint' queries</p>



<a name="160027606"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027606" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027606">(Mar 05 2019 at 18:35)</a>:</h4>
<p><a href="https://github.com/salsa-rs/salsa/issues/9" target="_blank" title="https://github.com/salsa-rs/salsa/issues/9">https://github.com/salsa-rs/salsa/issues/9</a> :-)</p>



<a name="160027619"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027619" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027619">(Mar 05 2019 at 18:35)</a>:</h4>
<p>aha :)</p>



<a name="160027632"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027632" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027632">(Mar 05 2019 at 18:35)</a>:</h4>
<p>I am not sure what "salsa-style fixed point" means though...</p>



<a name="160027789"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027789" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027789">(Mar 05 2019 at 18:37)</a>:</h4>
<p>yeah...</p>



<a name="160027907"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160027907" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160027907">(Mar 05 2019 at 18:38)</a>:</h4>
<blockquote>
<p>Why do you get cyclic queries then? Because macros can bring names into scope that change behavior?</p>
</blockquote>
<p>yes, to expand a macro we need to resolve its name first, and to do name resolution we need to expand macros, so naively expressing that in queries leads to a cycle immediately...</p>



<a name="160028004"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028004" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> detrumi <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028004">(Mar 05 2019 at 18:39)</a>:</h4>
<p>Right, but there should be some "correct" order in which to resolve things</p>



<a name="160028172"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028172" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> detrumi <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028172">(Mar 05 2019 at 18:40)</a>:</h4>
<p>Though maybe then you lose the opportunity to look at a piece of code independently, if it requires resolution of another part first</p>



<a name="160028532"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028532" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028532">(Mar 05 2019 at 18:43)</a>:</h4>
<p>maybe the resolution of the macro could be part of the input of the query? so we'd have a <code>expand(TokenTree, ResolvedMacro) -&gt; TokenTree</code> query</p>



<a name="160028612"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028612" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028612">(Mar 05 2019 at 18:44)</a>:</h4>
<p>oh, but the result of that query would change, of course</p>



<a name="160028625"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028625" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028625">(Mar 05 2019 at 18:44)</a>:</h4>
<p>though there could be a lowering step after that</p>



<a name="160028709"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028709" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028709">(Mar 05 2019 at 18:45)</a>:</h4>
<p>wait, that sounds like it could work?</p>



<a name="160028724"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028724" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028724">(Mar 05 2019 at 18:45)</a>:</h4>
<p>so <code>expand(LoweredMacroCall, ResolvedMacro) -&gt; Vec&lt;LoweredModuleItems&gt;</code></p>



<a name="160028736"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028736" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028736">(Mar 05 2019 at 18:45)</a>:</h4>
<p>got to run, will think about htat</p>



<a name="160028860"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028860" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028860">(Mar 05 2019 at 18:47)</a>:</h4>
<p>hm, no :(</p>



<a name="160028876"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028876" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028876">(Mar 05 2019 at 18:47)</a>:</h4>
<p>You still have <code>TokenTree</code> inside <code>LoweredMacroCall</code></p>



<a name="160028905"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160028905" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160028905">(Mar 05 2019 at 18:47)</a>:</h4>
<p>and <code>LoweredMouduleItems</code> can contains <code>LowerMacroCall</code>s</p>



<a name="160029005"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160029005" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160029005">(Mar 05 2019 at 18:48)</a>:</h4>
<p>we need to <strong>fully</strong> expand <code>-&gt; Vec&lt;LMI&gt;</code>, but to do that, we need to add nameres as an input to the query</p>



<a name="160029203"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160029203" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160029203">(Mar 05 2019 at 18:50)</a>:</h4>
<p>the <code>LoweredMacroCall</code> could be just an ID, I think, but the return value is a problem, yeah...</p>



<a name="160029588"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160029588" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Florian Diebold <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160029588">(Mar 05 2019 at 18:55)</a>:</h4>
<p>Adding the whole macro scope to the input would be too much, I guess...</p>



<a name="160192255"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160192255" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> pnkfelix <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160192255">(Mar 07 2019 at 12:22)</a>:</h4>
<blockquote>
<p>(not sure if this even is possible) add an explicit fixed-point "round" to the query parameter. That way, we can refer, via queries to macros from current-round - 1.</p>
</blockquote>
<p>have you given this more thought? I had thought this, or something like it (in terms of explicitly modeling the state of the fixed-point iteration in some fashion) would be necessary</p>



<a name="160195703"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160195703" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160195703">(Mar 07 2019 at 13:14)</a>:</h4>
<p>yep, I've thought about this a bit: even with explicit <code>round</code> parameter, it seems like it could work.</p>
<p>Specifically, at round <code>n</code> a macro call will be represented not as a token tree, but as <code>nth macro at x file at round n-1</code>.</p>



<a name="160195739"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160195739" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160195739">(Mar 07 2019 at 13:15)</a>:</h4>
<p>Though I think for the first implementation it makes sense to stick "typing inside a macro invalidates name resolution" strategy</p>



<a name="160195883"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160195883" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160195883">(Mar 07 2019 at 13:17)</a>:</h4>
<ul>
<li>name res is already too complicated, and making salsa aware of it will make it even more complex. </li>
<li>it seems to me that, because something like <code>syn</code> will bail on incomplete code, we are up for some recomputations anyway. Like, if you remove a <code>,</code> in a filed declaration, the <code>Derive(Serialize)</code> would not produce the same set of items.</li>
</ul>



<a name="160581195"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160581195" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160581195">(Mar 12 2019 at 15:41)</a>:</h4>
<p>Made some progress today for the simple "typing inside top-level macro invalidates the whole crate" approach</p>



<a name="160581321"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160581321" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160581321">(Mar 12 2019 at 15:43)</a>:</h4>
<p>The actual name resolution is empty at the moment <a href="https://github.com/rust-analyzer/rust-analyzer/blob/8120d763459ce5dff32057d1d8ee972cd9b64d34/crates/ra_hir/src/nameres/crate_def_map/collector.rs#L91-L94" target="_blank" title="https://github.com/rust-analyzer/rust-analyzer/blob/8120d763459ce5dff32057d1d8ee972cd9b64d34/crates/ra_hir/src/nameres/crate_def_map/collector.rs#L91-L94">https://github.com/rust-analyzer/rust-analyzer/blob/8120d763459ce5dff32057d1d8ee972cd9b64d34/crates/ra_hir/src/nameres/crate_def_map/collector.rs#L91-L94</a> :D</p>
<p>However, there's some code that does recursive macro expansion of macro rules, while walking the crate</p>



<a name="160581611"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160581611" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160581611">(Mar 12 2019 at 15:46)</a>:</h4>
<p>An interesting tidbit is that in this approach we are going to expand each macro call twice:</p>
<p>First, we eagerly expand the macro during name resolution, because we can't queryify it. Than, after name resolution is done, if some code needs to look inside the macro, it'll do so via query, which would use results of name resolution to resolve the macro and than do macro expansion the second time.</p>



<a name="160581671"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160581671" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160581671">(Mar 12 2019 at 15:47)</a>:</h4>
<p>In other words, perhaps slightly less confusing, we need to assign DefIds during name resolution, and DefId mentions the file (which could be a macro) where the Def comes from.</p>



<a name="160581833"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160581833" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160581833">(Mar 12 2019 at 15:49)</a>:</h4>
<p>We synthesize some files on the fly, so we need to make sure that later, when we query for Def's file, we get the same file we created during name resolution.</p>



<a name="160959831"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/160959831" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#160959831">(Mar 16 2019 at 17:26)</a>:</h4>
<p>I think this is more or less ready now: <a href="https://github.com/rust-analyzer/rust-analyzer/pull/968" target="_blank" title="https://github.com/rust-analyzer/rust-analyzer/pull/968">https://github.com/rust-analyzer/rust-analyzer/pull/968</a></p>



<a name="161043552"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161043552" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161043552">(Mar 18 2019 at 09:53)</a>:</h4>
<p>The PR is now merged, and I think it forms a pretty good basis for name resolution.  <span class="user-mention" data-user-id="116083">@pnkfelix</span> perhaps we could do a bit of a brainstorming about next steps for nameres librarification? It'd be cool to come up with a list of action items.</p>



<a name="161049686"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161049686" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> pnkfelix <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161049686">(Mar 18 2019 at 11:38)</a>:</h4>
<p>okay I should probably take a closer look at the PR itself before I try to figure out what the next steps are</p>



<a name="161050374"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161050374" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161050374">(Mar 18 2019 at 11:50)</a>:</h4>
<p>The PR is massive, because it also deletes existing impl. I suggest taking a look at the first commit (it has only the minimal infrastructure), and than at the current state of code in <code>ra_hir/src/nameres</code></p>



<a name="161334208"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161334208" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161334208">(Mar 21 2019 at 10:56)</a>:</h4>
<p><span class="user-mention" data-user-id="116083">@pnkfelix</span> did you get a chance to look at the PR?</p>



<a name="161334215"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161334215" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> pnkfelix <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161334215">(Mar 21 2019 at 10:56)</a>:</h4>
<p>no sorry not yet</p>



<a name="161334253"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161334253" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> pnkfelix <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161334253">(Mar 21 2019 at 10:57)</a>:</h4>
<p>I'll try to dive into it after I follow up on some unrelated performance issues with the compiler that I am looking at now</p>



<a name="161334515"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/New%20name%20resolution/near/161334515" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/New.20name.20resolution.html#161334515">(Mar 21 2019 at 11:01)</a>:</h4>
<p><span aria-label="thumbs up" class="emoji emoji-1f44d" role="img" title="thumbs up">:thumbs_up:</span>  I'll do other stuff meanwhile then: it seems like name resolution could benefit from a somewhat principled planing/designing, etc :)</p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>